const { checkToken } = require("../util.js");

const whiteList = ["/login", "/register"];

module.exports = () => {
    return async (ctx, next) => {
        // 如果是登录，就直接走
        if (whiteList.includes(ctx.path)) {
            await next();
            return;
        }

        // 从请求头中，获取 token 信息
        const token = ctx.headers.token;
        if (!token) {
            ctx.body = {
                code: 401,
                message: "token 不存在",
            };
            return;
        }

        // token 存在，校验是否合法
        // 解析 token
        try {
            // 解析成功后，就会返回 token 中保存的用户信息
            user = checkToken(token);
            ctx.user = user;
        } catch (error) {
            // token 过期错误
            if (error.name === "TokenExpiredError") {
                ctx.body = {
                    code: 401,
                    message: "token过期了",
                };
                return;
            }

            // token 篡改
            if (error.name === "JsonWebTokenError") {
                ctx.body = {
                    code: 401,
                    message: "token不合法",
                };
                return;
            }

            ctx.body = {
                code: 401,
                message: "token解析失败",
            };

            return;
        }

        // 这是中间件，如果都校验成功了，就向下执行
        await next();
    };
};
